接下來,我們來介紹 Rust 的基礎語法:變數宣告、條件控制以及三種迴圈。
我們可以使用 let 關鍵字來宣告變數,當單獨使用 let 時,產生的變數預設為不可變變數(immutable),如果嘗試修改不可變變數,將無法通過編譯。
若想要宣告可變變數,需另外加上 mut 關鍵字。
以下是一個範例:
fn main() {
// 宣告不可變變數
let x = 42;
// x = 100; // 錯誤寫法:編譯會出錯,因為嘗試修改不可變變數
// 可變變數
let mut y = 10;
y = 20; // 正常編譯,因為y是可變變數
println!("x: {}, y: {}", x, y); // 輸出:x: 42, y: 20
}
宣告變數時,可指定資料型態。
fn main(){
let x: i32 = 42; // 宣告一個32bit的整數
}
我們嘗試編譯這段程式碼,雖然可以通過編譯,但會觸發編譯器警告。
這是因為我們有宣告後未使用的變數,可以從這看到,Rust是相當嚴謹以及注重安全。
Rust 的 if 敘述與其他語言類似,但Rust 也有跟其他語言不同的地方,例如使用 if 時不需要括號 () 包著條件。
如果你喜歡有括號,還是可以按照原來的風格,不會造成任何影響,也沒有編譯器警告。
此外,if 也可以作為表達式回傳數值。
表達式是什麼?讓我們看這個範例吧
fn main() {
let number = 7;
// 傳統的 if
if number > 0 {
println!("正數");
} else if number < 0 {
println!("負數");
} else {
println!("零");
}
// 作為表達式的 if
let result = if number % 2 == 0 {
"偶數"
} else {
"奇數"
};
println!("數字 {} 是 {}", number, result); // 輸出結果:數字 7 是 奇數
}
以上是兩種 if 的使用方式,對比後,可以看到作為表達式的 if 讓程式變得更簡潔了。
match 是相當強大的模式匹配工具,作用類似其他語言的 switch,但使用時必須涵蓋所有可能,否則編譯會無法通過。
底下是使用範例
fn main() {
let day = 2;
match day {
1 => println!("星期一"),
2 => println!("星期二"),
3 => println!("星期三"),
_ => println!("其他日子"), // _ 是萬用字元,匹配其他情況,類似其他語言的 default
}
}
以上的程式輸出的結果是「星期二」
除了基本的資料結構,match 還可解構複雜資料結構。
以下是一個例子,讓 match 處理特殊的資料型態,Some(42) 表示裏面儲存42這個數值。
let value = Some(42);
match value {
Some(n) => println!("有值:{}", n),
None => println!("無值"),
}
輸出結果為有值:42。
有些人可能會覺得沒有必要用 Some、match 確認數值是否存在,但確認數值是否存在是相當重要的,嘗試讀取空值或None會導致錯誤。
在 Rust 中,有三種不同的迴圈,可以自行靈活運用在不用的場合。
loop 建立迴圈,通常與 break 或 continue 一起使用,來控制迴圈。
擁有程式語言基礎的人應該都知道 break、continue的作用了。
簡單說明一下,break是直接結束迴圈,continue是跳過一次迴圈後面的內容。
fn main() {
let mut count = 0;
loop {
count += 1;
if count == 3 {
println!("到達 3,跳出迴圈");
break; // 跳出迴圈
}
println!("次數:{}", count);
}
}
另外,loop 還有作為表達式的使用方法,能返回 break 後附上的值。
範例:
let result = loop {
break 42;
};
println!("結果:{}", result); // 結果:42
在 while 後的條件為 真(true) 時,將持續執行迴圈,直到條件不在成立。
fn main() {
let mut number = 5;
while number > 0 {
println!("倒數:{}", number);
number -= 1;
}
println!("離開迴圈!");
}
for 通常用於疊代範圍或陣列,這是使用方式:
fn main() {
// 疊代範圍
for i in 1..=5 { // 1..=5代表1到5。
// 如果把等號拿掉(也就是1..5)則代表1到4。
println!("數數兒:{}", i);
}
// 疊代陣列
let fruits = ["蘋果", "香蕉", "歐潤吉"];
for fruit in fruits.iter() {
println!("水果:{}", fruit);
}
}